#!/bin/bash

# 设置严格模式
set -euo pipefail

# 日志文件配置
BASH_DIR=$(cd "$(dirname "$0")" && pwd)
TODAY=$(date +%Y%m%d)
LOG_DIR=$BASH_DIR/$TODAY
if [ -d "$LOG_DIR" ]
then
  echo $LOG_DIR
else
  cd $BASH_DIR
  mkdir -p "$LOG_DIR"
  echo "创建日志目录: $LOG_DIR"
fi
LOG_FILE="$LOG_DIR/sftp_upload.log"
: > "$LOG_FILE"  # 清空日志文件

# 记录日志函数
log() {
    local level="$1"
    shift
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $*" | tee -a "$LOG_FILE"
}

# 获取上个月的年月(格式: YYYYMM)
LAST_MONTH=$(date -d "last month" +"%Y%m")

log "INFO" "=====开始执行SFTP上传脚本====="
log "INFO" "上个月日期: $LAST_MONTH"

# 本地和远程路径配置
LOCAL_BASE="E:\workSpace"
REMOTE_BASE=""
A_DATA_DIR="管理数据"

# SFTP连接信息
SFTP_SERVER="127.0.0.1"
SFTP_PORT="10022"
SFTP_USER="appoper"
SFTP_PASS="q1w2E#R$"

# 本地完整路径
LOCAL_DIR="$LOCAL_BASE/$LAST_MONTH/$A_DATA_DIR"

# 检查本地目录是否存在
if [ ! -d "$LOCAL_DIR" ]; then
    log "ERROR" "本地目录不存在: $LOCAL_DIR"
    exit 1
fi

log "INFO" "本地目录: $LOCAL_DIR"
log "INFO" "远程目录: $REMOTE_BASE/$LAST_MONTH/$A_DATA_DIR"

# 使用expect处理交互式SFTP并记录日志
log "INFO" "=====开始SFTP文件传输====="
expect <<EOF | tee -a "$LOG_FILE"
set timeout 30
spawn sftp -o HostKeyAlgorithms=ssh-rsa,ssh-dss -P $SFTP_PORT $SFTP_USER@$SFTP_SERVER
expect {
    "password:" {
        send "$SFTP_PASS\r"
    }
    timeout {
        puts "连接超时"
        exit 1
    }
    eof {
        puts "连接失败"
        exit 1
    }
}
expect "sftp>"
send "mkdir -p \"$REMOTE_BASE/$LAST_MONTH/$A_DATA_DIR\"\r"
expect "sftp>"
send "cd \"$REMOTE_BASE/$LAST_MONTH/$A_DATA_DIR\"\r"
expect "sftp>"
send "lcd \"$LOCAL_DIR\"\r"
expect "sftp>"

# 递归上传整个目录
send "put -r .\r"
expect {
    "100%" {
        puts "目录上传成功"
    }
    "sftp>" {
        # 验证上传是否成功
        send "ls -l\r"
        expect {
            -re {[-rwx]+\s+\d+\s+\d+\s+\d+\s+\d+} {
                puts "目录上传成功"
            }
            timeout {
                puts "目录上传失败 (验证超时)"
                exit 1
            }
        }
    }
    timeout {
        puts "目录上传失败 (操作超时)"
        exit 1
    }
}

send "exit\r"
expect eof
EOF

# 检查执行结果
if [ $? -eq 0 ]; then
    log "INFO" "文件上传成功到 $SFTP_SERVER:$REMOTE_BASE/$LAST_MONTH/$A_DATA_DIR"
    echo "文件上传成功，详情请查看日志: $LOG_FILE"
    exit 0
else
    log "ERROR" "文件上传失败"
    echo "文件上传失败，详情请查看日志: $LOG_FILE"
    exit 1
fi
